package ar.edu.ufasta.presupuestos.servicios.web.netpacks;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.StringTokenizer;

import ar.edu.ufasta.presupuestos.servicios.web.Constantes;

public class ListaPresupuestoResponse extends ResponsePack {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8074978096872613636L;
	private String nombreCliente;
	private String emailCliente;
	List<Hashtable<String, Object>> listaPrespuestos;
	
	
	/**
	 * @return the nombreCliente
	 */
	public String getNombreCliente() {
		return nombreCliente;
	}

	/**
	 * @param nombreCliente the nombreCliente to set
	 */
	public void setNombreCliente(String nombreCliente) {
		this.nombreCliente = nombreCliente;
	}

	/**
	 * @return the emailCliente
	 */
	public String getEmailCliente() {
		return emailCliente;
	}

	/**
	 * @param emailCliente the emailCliente to set
	 */
	public void setEmailCliente(String emailCliente) {
		this.emailCliente = emailCliente;
	}

	/**
	 * @return the listaPrespuestos
	 */
	public List<Hashtable<String, Object>> getListaPrespuestos() {
		return listaPrespuestos;
	}

	/**
	 * @param listaPrespuestos the listaPrespuestos to set
	 */
	public void setListaPrespuestos(List<Hashtable<String, Object>> listaPrespuestos) {
		this.listaPrespuestos = listaPrespuestos;
	}

	@Override
	public void codificarTrama() {
		trama = "";
		trama = trama + protocol + ";";
		trama = trama + systemCode + ";";
		trama = trama + resultCode + ";";
		if (resultCode == Constantes.TRANSACTION_OK){
			trama = trama + nombreCliente + ";";
			trama = trama + emailCliente + ";";
			//---- Lista Presupuestos ----//
			if (!listaPrespuestos.isEmpty()){
				String pLinea = "";
				for (Iterator<Hashtable<String, Object>> iterator = listaPrespuestos.iterator(); iterator.hasNext();) {
					Hashtable<String, Object> type = (Hashtable<String, Object>) iterator.next();
					// Armo una fila de la lista
					pLinea = "";
					pLinea = pLinea + (Integer)type.get("pID") + "|";
					SimpleDateFormat simple = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss", Locale.US);
					pLinea = pLinea + simple.format((Date)type.get("pFechaEmision")) + "|";
					pLinea = pLinea + type.get("pEstado") + "|";
					pLinea = pLinea + type.get("pFormaPago") + "|";
					pLinea = pLinea + type.get("pTotal") + "|";
					trama = trama + pLinea + "_"; 		
				}
				trama = trama + ";";
			}else
				trama = trama + " " + ";";
		}	
		int checksum = trama.length()+1;
		trama = trama + Integer.toString(checksum) + ";";
		trama = trama + "\n";
	}

	@Override
	public void decodificarTrama() {
		StringTokenizer st = new StringTokenizer(trama,";");
		st.countTokens();
		try {
			protocol = Integer.valueOf(st.nextToken());
			systemCode = Integer.valueOf(st.nextToken());
			resultCode = Integer.valueOf(st.nextToken());
			if (resultCode == Constantes.TRANSACTION_OK){
				nombreCliente = st.nextToken();
				emailCliente = st.nextToken();
				String listaPrespuestos = st.nextToken();
				StringTokenizer st2 = new StringTokenizer(listaPrespuestos,"_");
				st2.countTokens();
				while (st2.hasMoreTokens()) {
					String filaPresupuesto = st2.nextToken();
					StringTokenizer st3 = new StringTokenizer(filaPresupuesto,"|");
					st3.countTokens();
					Hashtable<String, Object> record = new Hashtable<String, Object>();
					record.put("pID", Integer.valueOf(st3.nextToken()));
					SimpleDateFormat simpleDate = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss", Locale.US);
					Date fecha = simpleDate.parse(st3.nextToken());
					record.put("pFechaEmision", fecha);
					record.put("pEstado", st3.nextToken());
					record.put("pFormaPago", st3.nextToken());
					record.put("pTotal", Double.valueOf(st3.nextToken()));
					this.listaPrespuestos.add(record);
				}
			}
		} catch (Exception e) {
			protocol = Constantes.PROTOCOL_100;
			systemCode = Constantes.SYSTEM_CODE;
			resultCode = Constantes.ERROR_OPERATIONCODE;
		}	
	}

}
